package cn.wolfcode.day01;


import org.activiti.engine.*;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.List;

public class Activiti7Demo01 {

    // 初始化
    @Test
    public void testInit(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(processEngine);
    }

    // 部署方法 （形成流程定义）
    @Test
    public void testDeploy(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取仓库 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 调用 RepositoryService 中的 API 来实现部署动作
        Deployment deploy = repositoryService.createDeployment()    // 创建部署对象
                .addClasspathResource("bpmn/leaveProcess.bpmn20.xml")   // 部署 XML 文件
                .addClasspathResource("bpmn/leaveProcess.png")          // 部署 PNG 图片
                .deploy();      // 部署

        // 在 Activiti7 中部署对象只有 id 和 时间。
        System.out.println("部署对象ID：" + deploy.getId());
        System.out.println("部署时间：" + deploy.getDeploymentTime());
    }

    // 启动流程 （形成流程实例）
    @Test
    public void testStartProcessInstance(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取运行时 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 调用 RuntimeService 中的 API 来启动流程实例
        ProcessInstance processInstance =
                runtimeService.startProcessInstanceByKey("leaveProcess");
        // ProcessDefinition ： 流程定义
        // ProcessInstance   ： 流程实例
        // Deployment        ： 部署
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
        System.out.println("当前流程定义对应的流程定义ID:" + processInstance.getProcessDefinitionId());
        System.out.println("当前流程定义对应的流程定义Key:" + processInstance.getProcessDefinitionKey());
    }

    // 查询待办任务
    @Test
    public void testQueryTask(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取任务 TaskService
        TaskService taskService = processEngine.getTaskService();
        // 查询指定用户的待办任务。
        String userId = "李四";
        // 查询待办任务
        /**
         * 只要是 Activiti7 中的查询。命令就是 XxxService.CreateXxxQuery
         * taskService.createTaskQuery()  ==>  select * from act_ru_task
         * .taskAssignee(userId) ==>  where assignee = "张三"
         * .processDefinitionKey("leaveProcess")  关联流程定义表。只要当前 leaveProcess Key 的中流程实例的任务。
         * 返回有三种
         *  1 .singleResult()  只返回一条数据
         *  2 .list()：返回集合
         *  3 .listPage()：返回分页集合
         */
        List<Task> taskList = taskService.createTaskQuery()       // 这里相当于 select 语句
                .taskAssignee(userId)       // 添加条件为指定负责人
                .processDefinitionKey("leaveProcess")   // 再次添加条件要求只要该 Key 的任务。
                .list();
        // 遍历这个待办任务集合
        for(Task task : taskList){
            System.out.println("任务ID：" + task.getId());
            System.out.println("任务名称：" + task.getName());
            System.out.println("任务负责人：" + task.getAssignee());
            System.out.println("任务创建时间：" + task.getCreateTime());
            System.out.println("当前任务对应的流程实例ID：" + task.getProcessInstanceId());
            System.out.println("当前任务对应的流程定义ID：" + task.getProcessDefinitionId());
        }
    }

    // 任务审批
    @Test
    public void testCompleteTask(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取任务 TaskService
        TaskService taskService = processEngine.getTaskService();
        // 任务 ID
        String taskId = "2505";
        // 完成任务
        taskService.complete(taskId);
    }

    // 在执行任务前给任务添加批注信息
    @Test
    public void testAddComment(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取任务 TaskService
        TaskService taskService = processEngine.getTaskService();
        // 任务 ID
        String taskId = "5002";
        // 流程实例 ID
        String processInstanceId = "2501";
        // 添加批注信息
        taskService.addComment(taskId,processInstanceId,"允许休假");
        // 完成任务
        taskService.complete(taskId);
    }

    // 查询历任事务
    @Test
    public void testQueryHistoryTask(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取历史 HistoryService
        HistoryService historyService = processEngine.getHistoryService();
        // 获取任务 TaskService 用来查询历史批注信息
        TaskService taskService = processEngine.getTaskService();
        // 查询历史任务
        List<HistoricTaskInstance> historyTaskList = historyService.createHistoricTaskInstanceQuery()
                .processDefinitionKey("leaveProcess")
                .finished() // 已完成任务
                .list();
        // 遍历历史任务
        for (HistoricTaskInstance task : historyTaskList) {
            System.out.println("任务ID：" + task.getId());
            System.out.println("任务名称：" + task.getName());
            System.out.println("任务负责人：" + task.getAssignee());
            System.out.println("任务创建时间：" + task.getCreateTime().toLocaleString());
            System.out.println("任务开始时间：" + task.getStartTime().toLocaleString());
            System.out.println("任务结束时间：" + task.getEndTime().toLocaleString());
            System.out.println("任务总耗时：" + task.getDurationInMillis()/1000/60 + "分");
            System.out.println("当前任务对应的流程实例ID：" + task.getProcessInstanceId());
            System.out.println("当前任务对应的流程定义ID：" + task.getProcessDefinitionId());
            List<Comment> taskComments = taskService.getTaskComments(task.getId());
            // 当判断一个集合或数组时，除了判定 != null 还需要判定 size()/length > 0
            if(taskComments != null && taskComments.size() > 0){
                System.out.println("批注信息：" + taskComments.get(0).getFullMessage());
            }
            System.err.println("♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥");
        }
    }
}
